// Jest Snapshot v1, https://goo.gl/fbAQLP

exports[`delegate_yield.js 1`] = `
async function *delegate_next() {
  async function *inner() {
    var x: void = yield; // error: number ~> void
  }
  yield *inner();
}
delegate_next().next(0);

async function *delegate_yield() {
  async function *inner() {
    yield 0;
  }
  yield *inner();
}
(async () => {
  for await (const x of delegate_yield()) {
    (x: void); // error: number ~> void
  }
});

async function *delegate_return() {
  async function *inner() {
    return 0;
  }
  var x: void = yield *inner(); // error: number ~> void
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
async function* delegate_next() {
  async function* inner() {
    var x: void = yield; // error: number ~> void
  }
  yield* inner();
}
delegate_next().next(0);

async function* delegate_yield() {
  async function* inner() {
    yield 0;
  }
  yield* inner();
}
async () => {
  for await (const x of delegate_yield()) {
    (x: void); // error: number ~> void
  }
};

async function* delegate_return() {
  async function* inner() {
    return 0;
  }
  var x: void = yield* inner(); // error: number ~> void
}

`;

exports[`generator.js 1`] = `
declare interface File {
  readLine(): Promise<string>;
  close(): void;
  EOF: boolean;
}

declare function fileOpen(path: string): Promise<File>;

async function* readLines(path) {
  let file: File = await fileOpen(path);

  try {
    while (!file.EOF) {
      yield await file.readLine();
    }
  } finally {
    file.close();
  }
}

async function f() {
  for await (const line of readLines("/path/to/file")) {
    (line: void); // error: string ~> void
  }
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
declare interface File {
  readLine(): Promise<string>;
  close(): void;
  EOF: boolean;
}

declare function fileOpen(path: string): Promise<File>;

async function* readLines(path) {
  let file: File = await fileOpen(path);

  try {
    while (!file.EOF) {
      yield await file.readLine();
    }
  } finally {
    file.close();
  }
}

async function f() {
  for await (const line of readLines("/path/to/file")) {
    (line: void); // error: string ~> void
  }
}

`;

exports[`return.js 1`] = `
declare var gen: AsyncGenerator<void,string,void>;

// You can pass whatever you like to return, it doesn't need to be related to
// the AsyncGenerator's return type
gen.return(0).then(result => {
  (result.value: void); // error: string | number ~> void
});

// However, a generator can "refuse" the return by catching an exception and
// yielding or returning internally.
async function *refuse_return() {
  try {
    yield 1;
  } finally {
    return 0;
  }
}
refuse_return().return("string").then(result => {
  if (result.done) {
    (result.value: string); // error: number | void ~> string
  }
});
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
declare var gen: AsyncGenerator<void, string, void>;

// You can pass whatever you like to return, it doesn't need to be related to
// the AsyncGenerator's return type
gen.return(0).then(result => {
  (result.value: void); // error: string | number ~> void
});

// However, a generator can "refuse" the return by catching an exception and
// yielding or returning internally.
async function* refuse_return() {
  try {
    yield 1;
  } finally {
    return 0;
  }
}
refuse_return()
  .return("string")
  .then(result => {
    if (result.done) {
      (result.value: string); // error: number | void ~> string
    }
  });

`;

exports[`throw.js 1`] = `
async function *catch_return() {
  try {
    yield 0;
  } catch (e) {
    return e;
  }
}

(async () => {
  catch_return().throw("").then(({value}) => {
    if (value !== undefined) {
      (value: void); // error: number ~> void
    }
  });
});

async function *yield_return() {
  try {
    yield 0;
    return;
  } catch (e) {
    yield e;
  }
}

(async () => {
  yield_return().throw("").then(({value}) => {
    if (value !== undefined) {
      (value: void); // error: number ~> void
    }
  });
});
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
async function* catch_return() {
  try {
    yield 0;
  } catch (e) {
    return e;
  }
}

async () => {
  catch_return()
    .throw("")
    .then(({ value }) => {
      if (value !== undefined) {
        (value: void); // error: number ~> void
      }
    });
};

async function* yield_return() {
  try {
    yield 0;
    return;
  } catch (e) {
    yield e;
  }
}

async () => {
  yield_return()
    .throw("")
    .then(({ value }) => {
      if (value !== undefined) {
        (value: void); // error: number ~> void
      }
    });
};

`;
